//package com.lsy.poi.row;
//
//import java.lang.reflect.InvocationTargetException;
//import java.util.HashSet;
//import java.util.List;
//import java.util.Set;
//
//import org.apache.commons.beanutils.BeanUtils;
//import org.apache.commons.beanutils.PropertyUtils;
//import org.apache.poi.xssf.usermodel.XSSFCell;
//import org.apache.poi.xssf.usermodel.XSSFRow;
//
//import com.lsy.poi.Parser;
//import com.lsy.poi.cell.CellParser;
//import com.lsy.poi.cell.validator.CellValidator;
//import com.lsy.poi.cell.validator.EquivalenceValidator;
//import com.lsy.poi.exception.IndexOverlappingException;
//import com.lsy.poi.row.validator.RowValidator;
//
//public class CopyOfRowParser implements Parser {
//	
//	private int beginIndex;
//	private int endIndex;
//	
//	/**
//	 * row 和 cellParsers、validators 之间是 "多对一" 的 关系，
//	 * 即 "多行row" 可以使用 "一组CellParser、一组RowValidator" 进行解析、验证
//	 */
//	private XSSFRow[]		rows;
//	private CellParser[]	cellParsers;
//	private RowValidator[]	validators;
//	
//	private List<?> hookList;  //TODO: 如果是 List<String> 貌似 没法做了。。。
//	private RowMapper<?> rowMapper;
////	private String[] propertyNames;
////	private Class<?> clazz;  //TODO: 如果是 List<String> 貌似 没法做了。。。
//	
//	/** 默认的 验证器列表：空，即 不做任何验证  */
//	private final static RowValidator[] DEFAULT_VALIDATORS = new RowValidator[]{};
//	/** 默认的 rowMapper: RowMapper  */
//	private final static RowMapper<T> DEFAULT_ROWMAPPER = new RowMapper();
//	
//	public void initErrors(List<String> errors) {
//		for (CellParser cellParser : cellParsers) {
//			cellParser.initErrors(errors);
//		}
//		
//		for (RowValidator rowValidator : validators) {
//			rowValidator.setErrors(errors);
//		}
//	}
//	
//	/**
//	 * 构造器
//	 */
//	//无 hookList、rowMapper ===================
//	public CopyOfRowParser(int beginIndex, int endIndex, CellParser[] cellParsers, RowValidator[] validators) {
//		this(beginIndex, endIndex, cellParsers, validators, null, null);
//	}
//	public CopyOfRowParser(int index, CellParser[] cellParsers, RowValidator[] validators) {
//		this(index, index, cellParsers, validators);
//	}
//	
//	
//	public CopyOfRowParser(int beginIndex, int endIndex, CellParser[] cellParsers) {
//		this(beginIndex, endIndex, cellParsers, DEFAULT_VALIDATORS);
//	}
//	public CopyOfRowParser(int index, CellParser[] cellParsers) {
//		this(index, index, cellParsers);
//	}
//	
//	//无 rowMapper ===================
//	public <T> CopyOfRowParser(int beginIndex, int endIndex, CellParser[] cellParsers, RowValidator[] validators, List<T> hookList) {
//		this(beginIndex, endIndex, cellParsers, validators, hookList, DEFAULT_ROWMAPPER);
//	}
//	public <T> CopyOfRowParser(int index, CellParser[] cellParsers, RowValidator[] validators, List<T> hookList) {
//		this(index, index, cellParsers, validators, hookList);
//	}
//
//	
//	public <T> CopyOfRowParser(int beginIndex, int endIndex, CellParser[] cellParsers, List<T> hookList) {
//		this(beginIndex, endIndex, cellParsers, DEFAULT_VALIDATORS, hookList);
//	}
//	public <T> CopyOfRowParser(int index, CellParser[] cellParsers, List<T> hookList) {
//		this(index, index, cellParsers, hookList);
//	}
//	
//	//全有 ===================
//	public <T> CopyOfRowParser(int beginIndex, int endIndex, CellParser[] cellParsers, RowValidator[] validators, List<T> hookList, RowMapper<T> rowMapper) {
//		super();
//		this.beginIndex = beginIndex;
//		this.endIndex = endIndex;
//		this.cellParsers = cellParsers;
//		this.validators = validators;
//		
//		
//		this.hookList = hookList;
//		this.rowMapper = rowMapper;
//		
////		if(propertyNames!=null && hookList!=null && clazz!=null) {
////			for (int i=beginIndex; i<endIndex+1; i++) {
////				T ele;
////				try {
////					ele = clazz.newInstance();
////					hookList.add(ele);
////				} catch (InstantiationException | IllegalAccessException e) {
////					e.printStackTrace();
////				}
////			}
////			this.hookList = hookList;
////			this.clazz = clazz;
////			
////			this.propertyNames = propertyNames;
////		}
//	}
//	public <T> CopyOfRowParser(int index, CellParser[] cellParsers, RowValidator[] validators, List<T> hookList, RowMapper<T> rowMapper) {
//		this(index, index, cellParsers, validators, hookList, rowMapper);
//	}
//
//	
//	public <T> CopyOfRowParser(int beginIndex, int endIndex, CellParser[] cellParsers, List<T> hookList, RowMapper<T> rowMapper) {
//		this(beginIndex, endIndex, cellParsers, DEFAULT_VALIDATORS, hookList, rowMapper);
//	}
//	public <T> CopyOfRowParser(int index, CellParser[] cellParsers, List<T> hookList, RowMapper<T> rowMapper) {
//		this(index, index, cellParsers, hookList, rowMapper);
//	}
//	
//	
//	
//
//
//	/**
//	 * 核心方法
//	 */
//	public void parse() throws Exception {
//		@SuppressWarnings("unchecked")
//		List<Object> eleList = (List<Object>) hookList;
//		
//		for (int rowIndex = 0; rowIndex<rows.length; rowIndex++) {
//			XSSFRow row = rows[rowIndex];
//			
//			Set<Integer> cellIndexSet = new HashSet<Integer>();//用于检测 "同一 row 的 多个 cell 不应当出现 index 之间的 重叠"
//			
//			for (CellParser cellParser : cellParsers) {
//				//1、构建 XSSFCell[] cells
//				int beginIndex = cellParser.getBeginIndex();
//				int endIndex = cellParser.getEndIndex();
//				
//				XSSFCell[] cells = new XSSFCell[endIndex-beginIndex+1];
//				
//				for(int i=beginIndex; i<endIndex+1; i++) {
//					int index = i-beginIndex;
//					cells[index] = row.getCell(i);
//					
//					if(!cellIndexSet.add(i)) {
//						/*
//						 * 1) 同一 row   的 多个 cell，不应当出现 cellIndex 之间的 重叠
//						 * 	对于一个 row 来说，有 2 个 CellParser 中 都同时包含了 (1行,3列) 这个单元格 的 cellValue，这其实是没有任何意义的
//						 * 
//						 * 2) 同一 sheet 的 多个  row，	可以出现  rowIndex 之间的 重叠
//						 * 	1. 第一次 可以 解析 1-6 行（row）的 0-10 列；第二次 可以解析 1-6 行（row）的 11-20 列
//						 * 	2. 可以对 1-6 行（row）的 0-10 列 进行反复的 解析
//						 * 
//						 */
//						String msg = row.getSheet().getSheetName() + "页，"
//									+ row.getRowNum() + "行"
//									+ i + "列 的 单元格 被 重复提取了";
//						
//						throw new IndexOverlappingException(msg);
//					}
//				}
//				
//				//2、将 cells 交给  cellParser
//				cellParser.setCells(cells);
//				
//				//3、解析 cellParser 中的  XSSFCell[] cells（提取值）
//				cellParser.parse();
//				
//			}
//			
//			//如果 有 "行验证器" 或者 "使用了 hookList"，则要进行 gatherCellValues() 操作
//			if((validators!=null && validators.length > 0) || (hookList!=null)) {
//				Object[] cellValues = gatherCellValues(cellParsers);
//				
//				//行验证器
//				if(validators.length > 0) {
//					for (RowValidator rowValidator : validators) {
//						rowValidator.validate(cellValues, row);
//					}
//				}
//				
//				//使用了 hookList
//				if(hookList != null) {
//					
//					rowMapper.mapRow(eleList, cellValues);
//					
////					if(hookList != null) {
////						
////						if(propertyNames!=null && clazz!=null) {
////							ele = clazz.newInstance();
////							
////							for (int i=0; i<propertyNames.length; i++) {
////								String propertyName = propertyNames[i];
////								Object cellValue = cellValues[i];
////								
////								/**
////								 * propertyName==null 是用来 空开位置 用的
////								 * cellValue!=null ：如果 值为 null 就 别 setProperty()，因为 javaBean 本身的值就是 null。而且 setProperty() 之后还会报错
////								 */
////								if((propertyName!=null) && (cellValue!=null)) {
////			
////									//属性值装载
////									BeanUtils.setProperty(ele, propertyName, cellValue);
////								}
////							}
////						}else {
////							
////							/**
////							 * 如果没有 定义 propertyNames，则认为：只取 Object[] cellValues 的 第一个元素
////							 */
////							ele = cellValues[0];
////						}
////						
////						eleList.add(ele);
//					
////					Object ele = hookList.get(rowIndex);// 从 hookList 获取一个 待进行 "属性值装载" 的 ele
////					for (int i=0; i<propertyNames.length; i++) {
////						String propertyName = propertyNames[i];
////						Object cellValue = cellValues[i];
////						
////						/**
////						 * propertyName==null 是用来 空开位置 用的
////						 * cellValue!=null ：如果 值为 null 就 别 setProperty()，因为 javaBean 本身的值就是 null。而且 setProperty() 之后还会报错
////						 */
////						if((propertyName!=null) && (cellValue!=null)) {
////
////							//属性值装载
////							BeanUtils.setProperty(ele, propertyName, cellValue);
////						}
////					}
//					
//					
//					
//				}
//			}
//			
//		}
//	}
//
//	
//	public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
////		Student ele = new Student();
////		System.out.println(ele);
////		BeanUtils.setProperty(ele, "id", 111);//正确
////		System.out.println(ele);
////		BeanUtils.setProperty(ele, "name", null);//正确
////		System.out.println(ele);
////		BeanUtils.setProperty(ele, "address", null);//正确
////		System.out.println(ele);
////		BeanUtils.setProperty(ele, "birthDay", null);//报错
////		System.out.println(ele);
//		
//		Student ele2 = new Student();
//		System.out.println(ele2);
//		PropertyUtils.setProperty(ele2, "id", 112);//正确
//		System.out.println(ele2);
//		PropertyUtils.setProperty(ele2, "name", null);//正确
//		System.out.println(ele2);
//		PropertyUtils.setProperty(ele2, "address", null);//正确
//		System.out.println(ele2);
//		PropertyUtils.setProperty(ele2, "birthDay", null);//报错
//		System.out.println(ele2);
//	}
//	
//	/**
//	 * 收集 各个 CellParser 中的 cellValues，并 汇总到一个  Object[] 中
//	 * 
//	 * 将：
//	 * [xxx][x]   [xx] [xxx]  [x]  [xxxx]
//	 * 汇总成：
//	 * [xxxxxxxxxxxxxx]
//	 * 
//	 */
//	private Object[] gatherCellValues(CellParser[] cellParsers) {
//		//1、获取 最小、最大的 endIndex
//		int minCellIndex = cellParsers[0].getBeginIndex(), //minCellIndex 是 整个 CellParser[] 的 偏移量
//			maxCellIndex = cellParsers[0].getEndIndex();
//		
//		for (CellParser cellParser : cellParsers) {
//			int beginIndex = cellParser.getBeginIndex();
//			minCellIndex = minCellIndex > beginIndex ? beginIndex : minCellIndex;
//			
//			int endIndex = cellParser.getEndIndex();
//			maxCellIndex = maxCellIndex < endIndex ? endIndex : maxCellIndex;
//			
//		}
//		
//		//2、构建空的 数组
//		Object[] totalCellValues = new Object[maxCellIndex-minCellIndex+1];//用于 收集所有 cellParser 中包含的 cellValues
//		
//		//3、收集 各个 CellParser 中的 cellValues，并 汇集到 totalCellValues 中
//		for (CellParser cellParser : cellParsers) {
//			int beginIndex = cellParser.getBeginIndex();
//			int endIndex = cellParser.getEndIndex();
//			Object[] cellValues = cellParser.getCellValues();
//			
//			for(int i=beginIndex; i<endIndex+1; i++) {
//				Object cellValue = cellValues[i-beginIndex];
//				totalCellValues[i-minCellIndex] = cellValue;
//			}
//			
//		}
//		
//		return totalCellValues;
//	}
//	
//	
//	
//	/**
//	 * 表头构造器：
//	 * "验证表头中的每个字段" 是一个 经常会遇到的需求：
//	 * 1) 使用 默认的 提取器：AdaptableCellExtractor
//	 * 2) 只用 1 个验证器：验证表头的 字面值 是否正确
//	 * 
//	 * ==> 老的做法
//	 * 	new CellParser[] {
//			new CellParser(0, new CellValidator[]{new EquivalenceValidator("AAA")}),
//			new CellParser(1, new CellValidator[]{new EquivalenceValidator("BBB")}),
//			new CellParser(2, new CellValidator[]{new EquivalenceValidator("CCC")}),
//			...
//	 	}
//	 *	
//	 * ==> 新的做法
//	 * constructHeaderParsers(String[] headers)
//	 */
//	public static CellParser[] constructHeaderParsers(String[] headers) {
//		
//		CellParser[] headerParsers = new CellParser[headers.length];
//		
//		for (int i=0; i<headers.length; i++) {
//			String header = headers[i];
//			headerParsers[i] = new CellParser(i, new CellValidator[]{new EquivalenceValidator(header)});
//		}
//		
//		return headerParsers;
//	}
//	
//	
//
//	public int getBeginIndex() {
//		return beginIndex;
//	}
//
//
//	public void setBeginIndex(int beginIndex) {
//		this.beginIndex = beginIndex;
//	}
//
//
//	public int getEndIndex() {
//		return endIndex;
//	}
//
//
//	public void setEndIndex(int endIndex) {
//		this.endIndex = endIndex;
//	}
//
//
//	public XSSFRow[] getRows() {
//		return rows;
//	}
//
//
//	public void setRows(XSSFRow[] rows) {
//		this.rows = rows;
//	}
//
//
//	public CellParser[] getCellParsers() {
//		return cellParsers;
//	}
//
//
//	public void setCellParsers(CellParser[] cellParsers) {
//		this.cellParsers = cellParsers;
//	}
//
//
//	public RowValidator[] getValidators() {
//		return validators;
//	}
//
//
//	public void setValidators(RowValidator[] validators) {
//		this.validators = validators;
//	}
//
//	public List<?> getHookList() {
//		return hookList;
//	}
//
//	public void setHookList(List<?> hookList) {
//		this.hookList = hookList;
//	}
//
//	public String[] getPropertyNames() {
//		return propertyNames;
//	}
//
//	public void setPropertyNames(String[] propertyNames) {
//		this.propertyNames = propertyNames;
//	}
//
//	public Class<?> getClazz() {
//		return clazz;
//	}
//
//	public void setClazz(Class<?> clazz) {
//		this.clazz = clazz;
//	}
//	
//	
//}
